namespace Digitalmes.Domain.Entities.Mes.Productions;

/// <summary>
/// 生产用料（关键物料/批次料）。
/// </summary>
[SugarTable("prod_material_consumption")]
public sealed class ProdMaterialConsumption : EntityBase
{
    /// <summary>
    /// SN
    /// </summary>
    [NotNull]
    public string? Sn { get; set; }

    /// <summary>
    /// 产线 Id。
    /// </summary>
    public long LineId { get; set; }

    /// <summary>
    /// 产线编号
    /// </summary>
    [NotNull]
    public string? LineCode { get; set; }

    /// <summary>
    /// 工序 Id。没有则为 0。
    /// </summary>
    public long OperationId { get; set; }

    /// <summary>
    /// 工序编号。没有则为空。
    /// </summary>
    [NotNull]
    public string? OperationCode { get; set; }

    /// <summary>
    /// 工位 Id。
    /// </summary>
    public long WorkstationId { get; set; }

    /// <summary>
    /// 工位编号
    /// </summary>
    [NotNull]
    public string? WorkstationCode { get; set; }

    /// <summary>
    /// 上料步序（仅适用关键物料），0 表示没有步序。
    /// </summary>
    public int Step { get; set; }

    /// <summary>
    /// 物料 Id。
    /// </summary>
    public long MaterialId { get; set; }

    /// <summary>
    /// 物料编码。
    /// </summary>
    [NotNull]
    public string? MaterialCode { get; set; }

    /// <summary>
    /// 物料属性（关键物料；批次料）
    /// </summary>
    [SugarColumn(SqlParameterDbType = typeof(EnumToStringConvert))]
    public MaterialAttrEnum MaterialAttr { get; set; }

    /// <summary>
    /// 物料条码。
    /// </summary>
    [NotNull]
    public string? Barcode { get; set; }

    /// <summary>
    /// 使用数量（针对于批次物料，关键物料使用数量为 1）
    /// </summary>
    public int Qty { get; set; }

    /// <summary>
    /// 上料时间。
    /// </summary>
    /// <remarks>关键物料为上料时间，批次料为过点时间。</remarks>
    public DateTime LoadingTime { get; set; }

    /// <summary>
    /// 上料人
    /// </summary>
    public string? LoadingBy { get; set; }

    /// <summary>
    /// 是否已解绑（仅适用关键物料）。
    /// </summary>
    /// <remarks>解绑后物料可再次使用</remarks>
    public bool IsUnbound { get; set; }

    /// <summary>
    /// 解绑人
    /// </summary>
    public string? UnboundBy { get; set; }

    /// <summary>
    /// 解绑时间
    /// </summary>
    public DateTime? UnboundTime { get; set; }
}
